package QianFeng17.ObserverPattern;

import org.junit.Test;
/**
 * 观察者模式：
 * 1、观察者模式原理
 *  观察者模式定义:简单地说，观察者模式定义了一个一对多的依赖关系，让一个或多个观察者对象监察一个主题对象。
 *  这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象，使这些观察者对象能够自动更新。
 * 2、观察者模式实现
 *  Subject (被观察的对象接口)
 *    规定ConcreteSubject的统一接 口;
 *    每个Subject可以有多个Observer;
 *  ConcreteSubject (具体被观察对象)
 *    维护对所有具体观察者的引用的列表;
 *    状态发生变化时会发送通知给所有注册的观察者。
 *  Observer (观察者接口)
 *    规定ConcreteObserver的统一接口;
 *    定义了一个update()方法，
 *    在被观察对象状态改变时会被调用。
 *  ConcreteObserver ( 具体观察者)
 *    维护一个对ConcreteSubject的引用;
 *    特定状态与ConcreteSubject同步;
 *    实现Observer接口，通过update()方法
 *    接收ConcreteSubject的通知。
 * 3、观察者模式作用
 *  观察者模式在被观察者和观察者之间建立一个抽象的耦合。
 *  被观察者角色所知道的只是一个具体观察者列表。
 *  由于被观察者和观察者没有紧密地耦合在一起，因此它们可以属于不同的抽象化层次。
 *  如果被观察者和观察者都被扔到一起，那么这个对象必然跨越抽象化和具体化层次。
 *  观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。
 **/
public class TestDemo {

    @Test
    public void testObserver() {
        Message message = new Message();
        Observer user1 = new User("大神");
        Observer user2 = new User("大佬");
        Observer user3 = new User("高手");
        //三者皆为Message的观察者
        message.registerObserver(user1);
        message.registerObserver(user2);
        message.registerObserver(user3);

        message.setMessage("亲们，你们好");
        message.removeObserver(user1);

        message.setMessage("有人吗，我要发红包");
    }
}
